<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
    <script>
        // js的作用域, 就是代码名字在某个范围内起作用和效果
        // 作用域是为了提高程序可靠性和减少变量命名冲突

        // 在es6才有块级作用域
        // es6之前:
        // 全局作用域：整个script标签中，或者单独的js文件
        // var num = 10;
        // console.log(num);
        // // 局部作用域: 在函数内部就是局部作用域，这个代码的名字只在函数内部起作用和效果
        // function a() {
        //     var num = 20;
        //     console.log(num);
        //     //局部作用域
        // }
        // a();



        // 变量也分为全局变量和局部变量：
        // 在全局作用域中的变量在全局都可以使用。注：如果在函数内部没有声明直接赋值的变量也属于全局变量
        // var c = 30;



        // // 局部变量 在局部作用域下 即 函数内部的变量就是局部变量 但是必须声明了才是局部变量
        // // 函数的形参也可以看做是局部变量
        // function fn() {
        //     var x = 10;
        //     y = 20;
        // }
        // console.log(x);
        // console.log(y);



        /* 全局变量只有在关闭浏览器才会销毁，比较占用内存资源
        局部变量程序执行完毕就会销毁，比较节约内存资源 */


        // 作用域链就是内部函数访问外部函数，采用链式查找的方式决定取哪个值，这种结构称为作用域链，就近原则

        function f1() {
            var num = 123;
            function f2() {
                console.log(num);
            }
            f2();
        }
        var num = 456;
        f1();



        var a = 1;
        function fn1() {
            var a = 2;
            var b = '22';
            fn2();
            function fn2() {
                var a = 3;
                fn3();
                function fn3() {
                    var a = 4;
                    console.log(a);
                    console.log(b);
                }
            }

        }
        fn1();




    </script>
</head>

<body>

</body>

</html>